#ifndef SEMANTICNODEUSING_H_
#define SEMANTICNODEUSING_H_

#include "SemanticNode.h"
#include "../syntax_tree.h"
#include "../main_container.h"

#include <string>
#include <sstream>
#include <map>
#include <vector>
#include <algorithm>

extern MainContainer * CompilerData;

/**
 * Semanticki nod koji opisuje using produkciju
 * @author cigla
 */
class SemanticNodeUsing: public SemanticNode {
private:
	/** lista using naredbi bez aliasa */
	std::vector<std::string> usingWithoutAlias;

	/** mapa using narebi s aliasima - key je alias, a value using naredba */
	std::map<std::string, std::string> usingWithAlias;

	/** using nod koji se nalazi u roditeljskom bloku */
	SemanticNodeUsing* parentUsing;

protected:

	virtual SemanticNodeUsing* getUsingNode();

public:
	/**
	 * Konstruktor semantickog noda using
	 * @param syntaxNode sintaksni nod na osnovu kojeg se stvara semanticki
	 * @param parent semanticki nod roditelj
	 */
	SemanticNodeUsing(SyntaxTreeNode& syntaxNode, SemanticNodeUsing* parentUsing, SemanticNode* parent);
	virtual ~SemanticNodeUsing();

	/**
	 * Provjera da li je u usungu (ili bilo kojem njegovom roditelju) definirano ime (ili postoji ime kao alias)
	 * --> ovo je privremena funkcija koja nece biti takva na kraju
	 * --> ovo sluzi samo za demonstraciju rekurzivnog poziva
	 * @param name ime koje se trazi
	 */
	bool containsName(std::string name);

	/**
	 * Kontrolni ispis
	 * @param tab broj početnih uvlaka
	 */
	virtual std::string toDebugString(int tab);
};

#endif /* SEMANTICNODEUSING_H_ */
